// Copyright (C) 2023 即时通讯网(52im.net) & Jack Jiang.
// The RainbowChat Project. All rights reserved.
// 
// 【本产品为著作权产品，合法授权后请放心使用，禁止外传！】
// 【本次授权给：<北京小羊驼科技有限公司>，授权编号：<NT231212144350>，代码指纹：<A.702363430.550>，技术对接人微信：<ID: wxid_wbyootvkdcgj22>】
// 【授权寄送：<收件：苏先生、地址：北京市大兴区北京密码西区6号楼1单元301、电话：18613885610、邮箱：bd@huiyuanxiang-inc.com>】
// 
// 【本系列产品在国家版权局的著作权登记信息如下】：
// 1）国家版权局登记名(简称)和权证号：RainbowChat    （证书号：软著登字第1220494号、登记号：2016SR041877）
// 2）国家版权局登记名(简称)和权证号：RainbowChat-Web（证书号：软著登字第3743440号、登记号：2019SR0322683）
// 3）国家版权局登记名(简称)和权证号：RainbowAV      （证书号：软著登字第2262004号、登记号：2017SR676720）
// 4）国家版权局登记名(简称)和权证号：MobileIMSDK-Web（证书号：软著登字第2262073号、登记号：2017SR676789）
// 5）国家版权局登记名(简称)和权证号：MobileIMSDK    （证书号：软著登字第1220581号、登记号：2016SR041964）
// * 著作权所有人：江顺/苏州网际时代信息科技有限公司
// 
// 【违法或违规使用投诉和举报方式】：
// 联系邮件：jack.jiang@52im.net
// 联系微信：hellojackjiang
// 联系QQ号：413980957
// 授权说明：http://www.52im.net/thread-1115-1-1.html
// 官方社区：http://www.52im.net
package com.x52im.rbchat.logic.sns_friend;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.ImageView;
import android.widget.TextView;

import com.eva.android.widget.ActivityRoot;
import com.eva.android.widget.DataLoadingAsyncTask2;
import com.eva.android.widget.WidgetUtils;
import com.eva.android.widget.alert.AlertDialog;
import com.eva.epc.common.util.CommonUtils;
import com.x52im.rbchat.MyApplication;
import com.x52im.rbchat.R;
import com.x52im.rbchat.cache.AlarmsProvider;
import com.x52im.rbchat.cache.ImageCacheLoader;
import com.x52im.rainbowchat.http.logic.dto.RosterElementEntity;
import com.x52im.rbchat.logic.alarm.AlarmType;
import com.x52im.rbchat.logic.search.content.MsgSummaryContent;
import com.x52im.rbchat.logic.search.model.MsgSummaryContentDTO;
import com.x52im.rbchat.logic.sns_group.GroupsFragment;
import com.x52im.rbchat.network.http.async.QueryFriendInfo;
import com.x52im.rbchat.utils.ActivityRequestCode;
import com.x52im.rbchat.utils.ActivityResultCode;
import com.x52im.rbchat.utils.IntentFactory;
import com.x52im.rbchat.utils.PreferencesToolkits;
import com.x52im.rbchat.utils.ToolKits;

import java.util.ArrayList;

/**
 * 一对一聊天信息界面（跟微信中的同名界面是等价的）。
 *
 * @author JackJiang
 * @since 8.0
 */
public class ChatInfoActivity extends ActivityRoot {

    private static String TAG = ChatInfoActivity.class.getSimpleName();

    /** 标签组件：好友的昵称显示（优先显示备注） */
    private TextView viewNickname = null;
    /** 图片组件：头像 */
    private ImageView viewAvadar = null;
    /** 标签组件：陌生人标签 */
    private TextView viewGuestFlag = null;

    /** 按钮：创建群聊 */
    private ImageView btnCreateGroup = null;

    /** 按钮：查找聊天记录 */
    private Button btnSearchHistory = null;
    /** 按钮：清空聊天记录 */
    private Button btnClearHistory = null;

    private Button btnClickMsgTone;
    private CheckBox msgToneChkBox;

    private Button btnClickAlwaysTop;
    private CheckBox alwaysTopChkBox;

    private String uidFromIntent = null,nicknameFromIntent = null;

    @Override
    protected void onResume(){
        super.onResume();
        refreshToView();
    }

    /**
     * 解析从Intent中传过来的可能的数据本方法中实现.
     * 例如从上一个activity中传过来的数据，本方法被 {@link #init(Bundle)}调用。
     */
    @Override
    protected void initDataFromIntent() {
        // 解析从intent中传过来的数据
        ArrayList<String> intentDatas = IntentFactory.parseChatInfoIntent(getIntent());
        uidFromIntent = intentDatas.get(0);
        nicknameFromIntent = intentDatas.get(1);
    }

    /**
     * <p>
     * UI的初始化在此方法中实现.
     * 例如设置context对象以及给需要用的组件初始化（例如使用fingviewbyid方法获取所需的对象）等。
     * 本方法被 {@link #init(android.os.Bundle)}调用。
     */
    @Override
    protected void initViews(Bundle savedInstanceState) {
        // 设定自定义标题栏（设定此值即意味着开启自定义标题栏的使用，必须要在setContentView前设定）
        customeTitleBarResId = R.id.sns_chat_info_activity_titleBar;
        // 养成良好习惯：首先设置主layout，确保后绪的操作中使用到的组件都可以被find到
        setContentView(R.layout.sns_chat_info_activity);

        viewNickname = findViewById(R.id.sns_chat_info_activity_nickNameView);
        viewAvadar = findViewById(R.id.sns_chat_info_activity_adavarImageView);
        viewGuestFlag = findViewById(R.id.sns_chat_info_activity_guestFlagView);
        btnSearchHistory = findViewById(R.id.sns_chat_info_activity_searhMsgHistoryBtn);
        btnClearHistory = findViewById(R.id.sns_chat_info_activity_clearMsgHistoryBtn);
        btnCreateGroup = findViewById(R.id.sns_chat_info_activity_createGroupImageView);

        btnClickMsgTone = findViewById(R.id.sns_chat_info_activity_msgNoPromtBtn);
        msgToneChkBox = findViewById(R.id.sns_chat_info_activity_msgNoPromt_switch);

        btnClickAlwaysTop = findViewById(R.id.sns_chat_info_activity_topBtn);
        alwaysTopChkBox = findViewById(R.id.sns_chat_info_activity_top_switch);

        // 设置标题
        this.setTitle("聊天信息");
    }

    /**
     * 本方法由父类的onCreate()调用，子类可在此方法中为各UI功能组件增加事件临听。
     */
    @Override
    protected void initListeners() {
        // 点击头像的事件处理
        viewAvadar.setOnClickListener(v -> QueryFriendInfo.gotoWatchUserInfo(self(), uidFromIntent, null));
        // "消息免打扰"按钮事件处理
        btnClickMsgTone.setOnClickListener(v -> msgToneChkBox.setChecked(!msgToneChkBox.isChecked()));
        // "消息免打扰"单选框事件处理
        msgToneChkBox.setOnCheckedChangeListener((buttonView, isChecked) -> PreferencesToolkits.setChatMsgToneOpen(self(), !isChecked, uidFromIntent));
        // "置顶聊天"按钮事件处理
        btnClickAlwaysTop.setOnClickListener(v -> alwaysTopChkBox.setChecked(!alwaysTopChkBox.isChecked()));
        // "置顶聊天"单选框事件处理
        alwaysTopChkBox.setOnCheckedChangeListener((buttonView, isChecked) -> AlarmsProvider.doSetAlwaysTopNow(self(), isChecked, isFriend()? AlarmType.friendChat:AlarmType.guestChat, uidFromIntent, viewNickname.getText().toString()));
        // 点击创建群聊
        btnCreateGroup.setOnClickListener(v -> doCreateGroup());
        // 点击清除聊天记录的事件处理
        btnClearHistory.setOnClickListener(v -> doClearHistory());
        // 查找聊天记录按钮的事件处理
        btnSearchHistory.setOnClickListener(v -> searhHistory(self(), MsgSummaryContentDTO.SEARCH_RESULT_CHAT_TYPE_SINGLE, uidFromIntent));
    }

    protected void refreshToView() {
        if(this.uidFromIntent != null && this.nicknameFromIntent != null){
            // 尝试读取好友信息（如果对方是好友的话）
            RosterElementEntity friendInfo = getFriendInfo();
            String userAvatarFileName = null;
            String nickname = this.nicknameFromIntent;
            boolean isFriend = (friendInfo != null);

            // 对方已是好友
            if(isFriend){
                userAvatarFileName = friendInfo.getUserAvatarFileName();
                nickname = friendInfo.getNickNameWithRemark();
                // 隐藏陌生人标签
                viewGuestFlag.setVisibility(View.GONE);
            }
            // 对方是陌生人
            else{
                // 对于陌生人来说，extra1String中，存放的就是可能最新头像文件名（在查看最新用户资料时设置进来的）
                userAvatarFileName = imc().getAlarmsProvider().getExtra1String(AlarmType.guestChat, uidFromIntent);
                // 为了防止别人仿冒，系统管理员不显示这个标签
                viewGuestFlag.setVisibility(ToolKits.isSystemAdmin(uidFromIntent)?View.GONE:View.VISIBLE);
            }

            // 昵称
            this.viewNickname.setText(nickname);
            // 初始化"消息免打扰"checkbox
            this.msgToneChkBox.setChecked(!PreferencesToolkits.isChatMsgToneOpen(this, uidFromIntent));
            // 初始化"置顶聊天"checkbox
            this.alwaysTopChkBox.setChecked(imc().getAlarmsProvider().isAlwaysTop4Single(uidFromIntent));

            if(!CommonUtils.isStringEmpty(userAvatarFileName) || !isFriend) {
                // 显示用户头像
                ImageCacheLoader.loadAvatarImgWithGlide(this, uidFromIntent, userAvatarFileName, viewAvadar, 30, R.drawable.default_avatar_yuan_60_3x, true, false);
            }
        } else{
            WidgetUtils.showWithDialog(this, $$(R.string.general_error), $$(R.string.general_invalid_data));
            Log.w(TAG, "无效的数据：uidFromIntent="+uidFromIntent+", nicknameFromIntent="+nicknameFromIntent);
            finish();
            return;
        }
    }

    private RosterElementEntity getFriendInfo(){
        try {
            return imc().getFriendsListProvider().getFriendInfoByUid2(uidFromIntent);
        } catch (Exception e){
            Log.w(TAG, e);
            return null;
        }
    }

    private boolean isFriend(){
        try {
            return imc().getFriendsListProvider().isUserInRoster2(uidFromIntent);
        } catch (Exception e){
            Log.w(TAG, e);
            return false;
        }
    }

    /**
     * 处理下一级Activity的结果回调通知.
     */
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        // 这是进入"创建群"的请求码（到此，意味着从建群界面返回了）
        if (requestCode == ActivityRequestCode.REQUEST_CODE_FOR_CREATE_GROUP) {// 将建群成功后的新建信息刷新到界面上及时显示
            if (resultCode == Activity.RESULT_OK) {
                setResult(ActivityResultCode.RESULT_CODE_FOR_CREATE_GROUP_SUCESS);
                finish();
            }
        } else {
            Log.d(TAG, "!!! onActivityResult-> requestCode=" + requestCode);
        }
    }

    /**
     * 创建群聊。
     */
    private void doCreateGroup(){
        // 对方是好友时，可邀请其创建群聊
        if(isFriend()) {
            GroupsFragment.gotoCreateGroup(self(), uidFromIntent);
        }
        // 不允许跟陌生人创建群聊
        else{
            WidgetUtils.areYouSure(self()
                    , "对方还不是你的好友，无法创建群聊。点击\""+$$(R.string.general_ok)+"\"按钮进入用户资料页面，可进行加好友操作！"
                    , $$(R.string.general_prompt)
                    , obj -> QueryFriendInfo.gotoWatchUserInfo(self(), uidFromIntent, null)
                    , obj -> {});
        }
    }

    /**
     * 清除聊天记录。
     */
    private void doClearHistory(){
        new AlertDialog.Builder(self())
                .setTitle($$(R.string.general_are_u_sure))
                .setMessage("确定清空和\""+nicknameFromIntent+"\"的所有聊天记录吗？")
                .setPositiveButton($$(R.string.general_clear), (dialog, which) -> clearHistory(self(), (isFriend() ? AlarmType.friendChat : AlarmType.guestChat), uidFromIntent))
                .setNegativeButton($$(R.string.general_cancel), null)
                .show();
    }

    /**
     * 清空聊天记录。
     *
     * @param c 上下文对象引用
     * @param alarmType 首页"消息"类型
     * @param dataId 聊天对象id
     */
    public static void clearHistory(final Context c, final int alarmType, final String dataId){
        new DataLoadingAsyncTask2<Object, Integer, Boolean>(c, "处理中，请稍候..") {
            @Override
            protected Boolean doInBackground(Object... uris) {
                try {
                    AlarmsProvider ap = MyApplication.getInstance2().getIMClientManager().getAlarmsProvider();
                    if (ap != null) {
//                        int alarmType = (isFriend() ? AlarmType.friendChat : AlarmType.guestChat);
                        // 先清除本地sqlite和内存中的聊天消息（注意：最后一个参数为true，表示将要通知
                        // ui应用层的观察者，即相关的观察者实现方法必须在主线程中执行，否则应用将崩溃）
                        ap.clearHistoryMessages(c, alarmType, dataId, true, true);
                        // 再置首页"消息"界面列表中的聊天信息item
                        ap.updateAlarmContentAndTime(alarmType, dataId, null, -1, true);
                        return Boolean.TRUE;
                    }
                } catch (Exception e) {
                    Log.w(TAG, e);
                }
                return Boolean.FALSE;
            }

            @Override
            protected void onPostExecuteImpl(Object result) {
                if (result != null && result == Boolean.TRUE) {
                    WidgetUtils.showToastLong(c, "聊天记录清空成功！", WidgetUtils.ToastType.OK);
                } else
                    WidgetUtils.showToastLong(c, "清空失败，请稍后再试！", WidgetUtils.ToastType.ERROR);
            }
        }.execute();
    }

    /**
     * 查找聊天记录。
     *
     * @param c 上下文对象引用
     * @param searchResultChatType 搜索聊天类型
     * @param dataId 聊天对象id
     */
    public static void searhHistory(Context c, int searchResultChatType, String dataId){
        // 注意此参数，它将决定子级页面里搜索的消息范围为该item指定的聊天对象范围内的消息记录
        MsgSummaryContentDTO currentSummaryResult = new MsgSummaryContentDTO();
        currentSummaryResult.setChatType(searchResultChatType);
        currentSummaryResult.setDataId(dataId);
        // 进入搜索Activity
        c.startActivity(MsgSummaryContent.createSearhMsgDetailIntent(c, null, currentSummaryResult));
    }
}
